home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1994 November / macformat-018.iso / Utility Spectacular / Disk / LoadADrive / C Source Code / LoadADrive.c next >
Encoding:
C/C++ Source or Header  |  1994-03-28  |  6.7 KB  |  360 lines  |  [TEXT/MPS ]

  1. // Source Code: (c) Dieter Spaar
  2.  
  3. // Freeware, but commercial use must be licensed
  4.  
  5. // Internet: spaar@mirider.abg.sub.org
  6.  
  7. // Dieter Spaar
  8. // Schnerzhofer Str. 2
  9. // 86865 Markt Wald
  10. // Germany
  11.  
  12.  
  13. // MPW version, use the following command:
  14.  
  15. // Rez LoadADrive.R -append -o LoadADrive
  16. // C LoadADrive.c -b -mbg on -sym on -opt off -warnings on -r
  17. // Link -sym on -l -t APPL -c 'DSLD' -msg dup,multiple,warn -ra %A5Init=resPreload,resLocked LoadADrive.C.o "{Libraries}"Runtime.o "{Libraries}"Interface.o "{CLibraries}"StdCLib.o -o LoadADrive > MAIN.MAP
  18. // SetFile -a Bi -d . -m . LoadADrive 
  19.  
  20.  
  21. #include     <Memory.h>
  22. #include     <Resources.h>
  23. #include    <Fonts.h>
  24. #include    <ToolUtils.h>
  25. #include    <Events.h>
  26. #include    <Windows.h>
  27. #include    <Dialogs.h>
  28. #include    <Controls.h>
  29. #include    <Packages.h>
  30. #include    <Menus.h>
  31. #include    <Strings.h>
  32. #include     <GestaltEqu.h>
  33. #include     <StandardFile.h>
  34. #include    <Aliases.h>
  35. #include    <Files.h>
  36. #include    <Devices.h>
  37. #include    <PLStringFuncs.h>
  38. #include     <StdArg.h>
  39. #include     <StdIO.h>
  40. #include     <StdLib.h>
  41.  
  42. /* some common constants */
  43.  
  44. #define TRUE    true
  45. #define FALSE    false
  46. #define NIL        nil
  47.  
  48. /* constants for compiler independency */
  49. /* here the MPW C-Compiler */
  50.  
  51. #define STATIC static
  52. #define EXTERN extern
  53. #define REGISTER register
  54. #define VOID void
  55. #define BYTE char
  56. #define WORD short
  57. #define LONG long
  58. #define BOOL Boolean
  59. #define UBYTE unsigned char
  60. #define UWORD unsigned short
  61. #define ULONG unsigned long
  62.  
  63. /* Resource */
  64.  
  65. /* ALRT */
  66.  
  67. #define ErrorAlert    128
  68.  
  69. /* alis */
  70.  
  71. #define INIT_ALIAS    128
  72.  
  73. /* STR */
  74.  
  75. #define DriverName    128
  76.  
  77. VOID eprintf(BYTE *format,...)
  78. {
  79.     BYTE buf[400];
  80.     va_list arg;
  81.     
  82.     va_start(arg,format);
  83.     vsprintf(buf,format,arg);
  84.     va_end(arg);
  85.     
  86.     c2pstr(buf);
  87.     ParamText(buf,"","","");
  88.     NoteAlert(ErrorAlert,NIL);
  89. }
  90.  
  91. /* get filename */
  92.  
  93. BOOL GetFilename(BYTE *name,WORD *vRefNum)
  94. {
  95.     Point where;
  96.     SFReply reply;
  97.     SFTypeList typeList;
  98.     
  99.     where.v=50;
  100.     where.h=70;
  101.     typeList[0]='INIT';
  102.     SFGetFile(where,"",NIL,1,typeList,NIL,&reply);
  103.     PLstrcpy(name,&reply.fName);
  104.     *vRefNum=reply.vRefNum;
  105.     
  106.     return reply.good;
  107. }
  108.  
  109. /* Create Alias of file and store it in the resource fork */
  110.  
  111. BOOL MakeMyAlias(VOID)
  112. {
  113.     WORD vRefNum;
  114.     Str63 fName;
  115.     FSSpec fSpec;
  116.     OSErr err;
  117.     AliasHandle alias;
  118.     Handle h;
  119.     
  120.     // get filename
  121.     
  122.     if( !GetFilename(fName,&vRefNum) )
  123.         return FALSE;
  124.  
  125.     // make FSSpec
  126.     
  127.     err=FSMakeFSSpec(vRefNum,0,fName,&fSpec);
  128.     if( err!=noErr ) {
  129.         eprintf("Error creating FSSpec.\n(err=%d)",err);
  130.         return FALSE;
  131.     }
  132.     
  133.     // create alias
  134.     
  135.     err=NewAlias(NIL,&fSpec,&alias);
  136.     if( err!=noErr ) {
  137.         eprintf("Error creating Alias.\n(err=%d)",err);
  138.         return FALSE;
  139.     }
  140.     
  141.     // delete old alias in resource
  142.     
  143.     SetResLoad(FALSE);
  144.     h=Get1Resource(rAliasType,INIT_ALIAS);
  145.     SetResLoad(TRUE);
  146.     
  147.     if(h!=NIL && ResError()==noErr) {
  148.         RmveResource(h);
  149.         err=ResError();
  150.         if( err!=noErr )
  151.             eprintf("Cannot remove old Alias from resource fork (maybe File/Drive protected).\n(err=%d)",err);
  152.     }
  153.     if(h!=NIL)
  154.         DisposHandle(h);
  155.         
  156.     // add alias to resource
  157.     
  158.     h=(Handle)alias;
  159.     AddResource(h,rAliasType,INIT_ALIAS,"\pInit");
  160.     err=ResError();
  161.     if(err!=noErr) {
  162.         eprintf("Error adding new Alias to resource fork.\n(err=%d)",err);
  163.         DisposHandle(h);
  164.         return FALSE;
  165.     }
  166.     UpdateResFile(CurResFile());
  167.     
  168.     err=ResError();
  169.     if(err!=noErr) {
  170.         eprintf("Error updating resource fork.\n(err=%d)",err);
  171.         ReleaseResource(h);
  172.         return FALSE;
  173.     }
  174.     ReleaseResource(h);
  175.  
  176.     return TRUE;
  177. }
  178.  
  179. /* Resolve file alias */
  180.  
  181. BOOL ResolveMyAlias(FSSpecPtr initFSSpec)
  182. {
  183.     Handle h;
  184.     OSErr err;
  185.     BOOL wasChanged;
  186.     
  187.     // get alias
  188.     
  189.     h=Get1Resource(rAliasType,INIT_ALIAS);
  190.     if( h==NIL ) {
  191.         eprintf("Cannot find Alias in resource fork.");
  192.         return FALSE;
  193.     }
  194.     
  195.     // resolve alias
  196.     
  197.     err=ResolveAlias(NIL,(AliasHandle)h,initFSSpec,&wasChanged);
  198.     if(err!=noErr) {
  199.         eprintf("Cannot resolve Alias.\n(err=%d)",err);
  200.         return FALSE;
  201.     }
  202.     
  203.     // maybe update alias
  204.     
  205.     if( wasChanged ) {
  206.         ChangedResource(h);
  207.         UpdateResFile(CurResFile());
  208.         err=ResError();
  209.         if( err!=noErr )
  210.             eprintf("Cannot write back updated Alias.\n(err=%d)",err);
  211.     }
  212.     
  213.     ReleaseResource(h);
  214.     
  215.     return TRUE;
  216. }
  217.  
  218. /* check if a modifier key is pressed */
  219.  
  220. BOOL modifier(WORD mask)
  221. {
  222.     EventRecord theEvent;
  223.     
  224.     EventAvail(everyEvent, &theEvent);
  225.     if( theEvent.modifiers & mask )
  226.         return TRUE;
  227.     else
  228.         return FALSE;
  229. }
  230.  
  231. // this is the whole magic to load the Apple CD-ROM Driver
  232.  
  233. BOOL LoadInit(FSSpecPtr initFSSpec)
  234. {
  235.     WORD refNum,ret;
  236.     Handle hdl;
  237.     OSErr err;
  238.     BYTE name[50];
  239.     
  240.     // get driver name
  241.     
  242.     name[0]=0;
  243.     hdl=Get1Resource('STR ',DriverName);
  244.     if(hdl) {
  245.         PLstrcpy(name, *hdl);
  246.         ReleaseResource(hdl);
  247.     }
  248.     
  249.     // look for driver
  250.     
  251.     if(name[0])    {
  252.         if(OpenDriver(name,&refNum) == noErr) {
  253.             p2cstr(name);
  254.             eprintf("Driver '%s' already loaded.",name);
  255.             return FALSE;
  256.         }
  257.     }
  258.     
  259.     
  260.     // open resource fork
  261.     
  262.     refNum=FSpOpenResFile(initFSSpec, fsCurPerm);
  263.     err=ResError();
  264.     if(refNum == -1 || err!=noErr) {
  265.         eprintf("Cannot open file '%s'.\n(err=%d)", initFSSpec->name, err);
  266.         return FALSE;
  267.     }
  268.     
  269.     // load INIT
  270.     
  271.     hdl=Get1IndResource('INIT',1);
  272.     if(hdl==0) { 
  273.         eprintf("Cannot load INIT from driver.");
  274.         CloseResFile(refNum);
  275.         return FALSE;
  276.     }
  277.     HLock(hdl);
  278.     SetZone(SystemZone());
  279.     
  280.     // run INIT in System Zone
  281.     
  282.     ret=(*(WORD(*)())(*hdl))();
  283.     
  284.     SetZone(ApplicZone());
  285.     HUnlock(hdl);
  286.     ReleaseResource(hdl);
  287.     CloseResFile(refNum);
  288.     
  289.     if(ret) { // return code always 0 ?
  290.         eprintf("Cannot initialize Driver.\n(err=%d)",ret);
  291.         return FALSE;
  292.     }
  293.     
  294.     // look for driver
  295.     
  296.     if(name[0])    {
  297.         if(OpenDriver(name,&refNum) != noErr) {
  298.             p2cstr(name);
  299.             eprintf("Driver '%s' not loaded.",name);
  300.             return FALSE;
  301.         }
  302.     }
  303.     
  304.     return TRUE;
  305. }
  306.  
  307. main()
  308. {
  309.     Handle hdl;
  310.     FSSpec initFSSpec;
  311.     LONG gesResponse;
  312.     
  313.     // initialisation
  314.     
  315.     MaxApplZone();    
  316.     InitGraf(&qd.thePort);
  317.     InitFonts();
  318.     FlushEvents(everyEvent, 0);
  319.     InitWindows();
  320.     InitMenus();
  321.     TEInit();
  322.     InitDialogs(nil);
  323.     InitCursor();
  324.         
  325.     // check for essential Mangers
  326.     
  327.     if ( Gestalt (gestaltFSAttr, &gesResponse) || !BitTst(&gesResponse,31 - gestaltFullExtFSDispatching) ||
  328.      !BitTst(&gesResponse,31 - gestaltHasFSSpecCalls) ||
  329.      Gestalt (gestaltAliasMgrAttr, &gesResponse) || !BitTst(&gesResponse,31 - gestaltAliasMgrPresent) ) {
  330.          eprintf("You need the Alias Manager and the File Manager for 'LoadADrive' to run.");
  331.         return;
  332.     }
  333.     
  334.     // command key down: always ask for file
  335.     
  336.     if(modifier(cmdKey))
  337.         hdl=NIL;
  338.     else
  339.         hdl=Get1Resource(rAliasType,INIT_ALIAS);
  340.     if( hdl==NIL ) {
  341.         eprintf("LoadADrive V 1.0\n\nFreeware by Dieter Spaar\nCommercial use must be licensed.\nInterNet: spaar@mirider.abg.sub.org");
  342.         eprintf("Mount CD-ROM without Restart. Select the CD-ROM Driver now.");
  343.         if(!MakeMyAlias())
  344.             return;
  345.     }
  346.     else
  347.         ReleaseResource(hdl);
  348.     
  349.     // get FSSPec of file
  350.     
  351.     if(!ResolveMyAlias(&initFSSpec)) {
  352.         eprintf("Select the CD-ROM Driver now.");
  353.         if(!MakeMyAlias())
  354.             return;
  355.     }
  356.     
  357.     // and now load the file
  358.     
  359.     LoadInit(&initFSSpec);
  360. }